package com.bnz.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.bnz.entity.User;
import com.bnz.exception.MyException;
import com.bnz.service.UserService;
import com.bnz.util.R;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

/**
 * 登录
 */

@Controller // 注入到spring容器
@RequestMapping("user")
public class UserController {

    // 从注册的容器中拿service(alibaba)
    @Reference
    private UserService userService;

    /**
     * 1、用户进行登录
     */
    @RequestMapping("login1")
    public String login(String username, String password, HttpSession session){
        // 1.1、对用户名，密码进行绑定(equalsIgnoreCase:将字符串与指定的对象比较，不考虑大小写。)
        if ("aa".equalsIgnoreCase(username) && "123".equalsIgnoreCase(password)){
            // 1.2、将用户名放进session里
            session.setAttribute("username",username);
            // 1.3、返回全部数据的视图
            return "redirect:/student1/list.do";
        }else {
            // 这里是密码不正确，返回登录界面
            return "redirect:/login.jsp";
        }
    }

    /**
     * 2、测试全局异常处理-->自定义异常
     */
    @RequestMapping("exin")
    @ResponseBody // 将java对象转为json格式的数据
    public void exin(){
        int a = 0;
        if (a == 0){
            // 抛出一个新异常
            throw new MyException("有异常");
        }
    }

    /**
     * 3、测试全局异常处理->一般异常
     */
    @RequestMapping("test")
    @ResponseBody // 将java对象转换为json格式的数据
    public void test(){
        // 抛出新异常
        throw new RuntimeException();
    }

    /**
     * 4、测试文件上传(同步)
     * @return
     */
    @PostMapping("upload")
    // 这里的mfile是前端的-》 <input type="file" name="mfile">
    //HttpServletRequest对象代表客户端的请求，当客户端通过HTTP协议访问服务器时，HTTP请求头中的所有信息都封装在这个对象中，通过这个对象提供的方法，可以获得客户端请求的所有信息。
    public String upload(HttpServletRequest request, MultipartFile mfile) throws IOException {
        // 4.1、得到上传了的文件真实名称（mfile是前端的参数）
        String originalFilename = mfile.getOriginalFilename();
        // 4.2、获取文件的后缀名(文件.的后面就是后缀)
        String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
        // 4.3、使用uuid来生成主文件名
        String fname = UUID.randomUUID().toString();
        // 4.4、现在开始文件上传
        // 4.4.1、拿到/upload的真实物理路劲
        // ①得到application对象
        ServletContext context = request.getServletContext();
        // ②得到web根目录下的upload真实的物理路径
        String realPath = context.getRealPath("/upload");
        // 4.4.2、构造要上传的文件，进行上传(路径/uuid生成的文件名+后缀)
        File file = new File(realPath + "/" + fname + substring);
        // 4.4.3、开始文件上传
        mfile.transferTo(file);
        // 返回文件上传后的界面(逻辑视图)
        return "/upload/list";
    }

    /**
     * 下面是异步文件上传
     * @return
     */
    // 1、用户登录
    @RequestMapping("login")
    @ResponseBody
    public R login(){
        return R.ok().data("token",1);
    }

    // 2、用户信息
    @RequestMapping("info")
    @ResponseBody // 将java对象转换为json格式的数据
    public R info(){
        R r = R.ok().data("name","admin")
                .data("avatar","https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif");
        return r;
    }

    // 3、查询所有用户数据
    @GetMapping("findAll")
    @ResponseBody // 将java对象转换为json格式的数据
    public R findAll(){
        // 3.1-查询所有数据
        List<User> all = userService.findAll();
        return R.ok().data("list",all);
    }

    // 4、添加用户数据
    @PostMapping("add")
    @ResponseBody // 将java对象转换为json格式的数据
    // @RequestBody //将前端传过来的json数据转换为Java
    public void add(@RequestBody User user){

    }
}
